﻿Imports SocketCliente
Imports System.Threading

Public Class ModeloHC
    'Propiedades:
    Private aAventuras As ArrayList 'Array de aventuras.
    Private miDataset As DataSet '

    'Eventos:
    Dim WithEvents WinSockCliente As New SocketCliente.SocketCliente

    'Constructor:
    Sub New()
        Me.aAventuras = New ArrayList
        Me.miDataset = New DataSet
        Me.iniciarConexion()
    End Sub

    '_______GETTERS__________

    'Devuelve un ArrayList con los nombres las aventuras que se tienen almacenadas.
    Public Function getNombreAvent() As ArrayList
        Dim x As Integer
        Dim nombreA As New ArrayList
        Dim aventura As Aventura

        For x = 0 To Me.aAventuras.Count - 1
            aventura = aAventuras.Item(x)
            nombreA.Add(aventura.getNombreAventura())
        Next x
        Return nombreA
    End Function

    Public Function getDataSet() As DataSet
        Return Me.miDataset
    End Function

    '_______SETTERS__________
    Public Sub setDataSet(ByVal miDataSet As DataSet)
        Me.miDataset = miDataSet
    End Sub

    '_______METODOS__________

    'Transforma una cadena de texto con el contenido de un archivo xml a un DataSet.
    'Para que esto haya sido posible, antes el archivo xml ha tenido que haberse creado
    'a partir de DataSet.WriteXml()
    Public Sub textToDataset(ByVal text As String)
        Dim cadena() As String
        Dim path As String = "E:\[Cliente]dataset.xml"
        Dim archivo As IO.StreamWriter
        Try
            'Separa el bloque a tratar del flag.
            cadena = Split(text, "</xml>")
            'Crea archivo, le introduce la cadena a tratar y lo cierra.
            archivo = IO.File.CreateText(path)
            archivo.Write(cadena(0))
            archivo.Close()
            'Limpia el dataset de toda la información que contenia.
            Me.miDataset.Clear()
            'Obtiene la nueva estructura de datos del archivo XML.
            Me.miDataset.ReadXml(path)
            'Asignación de los datos a las correspondientes clases.
            Me.asignarDatosToAventuras()
        Catch ex As Exception
            MsgBox(ex.ToString)
        Finally
            'Elimina el xml temporal.
            IO.File.Delete(path)
        End Try
    End Sub

    Private Sub asignarDatosToAventuras()

        Dim x As Integer
        Dim id As Integer
        Dim master As String
        Dim nombreA As String
        Dim sistema As Integer

        'Reinicia de la array para la nueva asignación de datos.
        Me.aAventuras.Clear()

        'Recorre la tabla aventuras para asignar los datos a una aventura.
        For x = 0 To Me.miDataset.Tables("aventuras").Rows.Count - 1
            'Asignación de valores a las variables.
            id = Me.miDataset.Tables("aventuras").Rows(x)(0)
            nombreA = Me.miDataset.Tables("aventuras").Rows(x)(1)
            master = Me.miDataset.Tables("aventuras").Rows(x)(2)
            sistema = Me.miDataset.Tables("aventuras").Rows(x)(3)
            'Nueva aventura con sus valores.
            Dim aventura As New Aventura(id, nombreA, sistema, master)
            'Añade la aventura al ArrayList de Aventuras.
            Me.aAventuras.Add(aventura)
        Next x
    End Sub

    Public Sub nuevaAventura2(ByVal nombreA As String, ByVal master As String, ByVal sistema As Integer)
        Dim aventura As Aventura
        Dim query As String

        'Crea nueva aventura
        aventura = New Aventura(-1, nombreA, sistema, master)
        'La agrega al array
        Me.aAventuras.Add(aventura)
        'Query para enviarsela al servidor.
        query = "insert into aventuras (nombre,master,sistema) values ('" & nombreA & "','" & master & "'," & sistema & ")"
        'Se agrega el flag.
        query = query + "</consulta>"

        WinSockCliente.EnviarDatos(query)
    End Sub

    Private Sub iniciarConexion()
        Dim conThd As Thread 'Se encarga de escuchar mensajes enviados por el Servidor 

        Try
            With WinSockCliente
                'Determino a donde se quiere conectar el usuario 
                .IPDelHost = "127.0.0.1"
                .PuertoDelHost = "8050"
                'Crea e inicia un thread para que se conecte al servidor.
                conThd = New Thread(AddressOf .Conectar)
                conThd.Start()
            End With
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub WinSockCliente_ConexionTerminada() Handles WinSockCliente.ConexionTerminada
        Dim conThd As Thread 'Se encarga de establecer conexión con el servidor 
        Try
            'Crea e inicia un thread para que se conecte al servidor.
            conThd = New Thread(AddressOf WinSockCliente.Conectar)
            conThd.Start()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub WinSockCliente_DatosRecibidos(ByVal datos As String) Handles WinSockCliente.DatosRecibidos
        Me.textToDataset(datos)
    End Sub
End Class
